package com.task.common.utils;


import cn.hutool.core.net.NetUtil;
import cn.hutool.core.lang.Snowflake;
import cn.hutool.core.util.IdUtil;

import javax.annotation.PostConstruct;

public class GeneratorIdUtils {

//    public static RedisCache getRedisCacheService() {
//        return SpringContextUtils.getBean(RedisCache.class);
//    }
//
//    public static synchronized long generateId() {
//        // 获取当前的秒级时间戳
//        long timestamp = System.currentTimeMillis() / 1000;  // 秒级时间戳
//
//        // 生成一个0-999范围内的随机数
//        int random = (int) (Math.random() * 1000);  // 随机数，范围0-999
//
//        // 从Redis获取一个递增的序列号，范围0-63
//        long sequence = getRedisCacheService().redisTemplate.opsForValue()
//                .increment(RedisKeyConstants.DISTRIBUTED_GENERATE_ID.formatKey(), 1);
//
//        // 时间戳使用低16位，随机数使用中间10位，Redis序列使用低6位
//        long id = (timestamp % 1000000) << 16 | (random % 1000) << 6 | (sequence % 64);
//
//        // 返回最终的32位数字，且确保 % 20 均匀分布
//        return id;  // 返回20位数字，保证对20均匀分布
//    }

    private static long workerId = 0;  //第几号机房
    private static long datacenterId = 1;  //第几号机器
    private static Snowflake snowflake = IdUtil.createSnowflake(workerId, datacenterId);

    @PostConstruct  //构造后开始执行，加载初始化工作
    public void init(){
        try{
            //获取本机的ip地址编码
            workerId = NetUtil.ipv4ToLong(NetUtil.getLocalhostStr());
        }catch (Exception e){
            e.printStackTrace();
            workerId = NetUtil.getLocalhostStr().hashCode();
        }
    }

    public synchronized  static long snowflakeId(){
        return snowflake.nextId();
    }

    public synchronized static long snowflakeId(long workerId, long datacenterId){
        Snowflake snowflake = IdUtil.createSnowflake(workerId, datacenterId);
        return snowflake.nextId();
    }




}
